package com.wang.java.basic.framework.queue.blockingqueue.transferqueue;

import java.util.concurrent.LinkedTransferQueue;

/**
 * 同步阻塞队列，LinkedBlockingQueue + SynchronousQueue，相比SynchronousQueue多了存储数据的缓冲队列，相比LinkedBlockingQueue少了锁同步，直接将数据传输给生产者
 * 如果只有put()，则将数据存储到缓冲队列，如果缓存队列没有数据时take()，则将线程记录并阻塞，直到有数据put()进来，会put()到阻塞线程的位置（waiter)
 * 数据结构：基于TransferQueue、TransferStack实现
 * 线程安全：是，基于CAS实现
 * 队列长度：
 * 阻塞性：阻塞
 */
public class LinkedTransferQueueTest {
    public static void main(String[] args) throws InterruptedException {
        LinkedTransferQueue<String> linkedTransferQueue = new LinkedTransferQueue<>();
        // 消费
        new Thread(() -> {
            try {
                String str = linkedTransferQueue.take();
                System.out.println(str);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        // 生产
        for (int i = 0; i < 10; i++) {
            linkedTransferQueue.put(i + "");
        }
    }
}
